15.7 Ereignisse einer Form
 
Die meisten der von einem Form-Objekt veröffentlichten Ereignisse werden von der Basisklasse Control geerbt und sind somit auch Ereignisse aller anderen grafischen Komponenten, die Control als Basisklasse haben. An dieser Stelle eine lückenlose Liste aufzuführen, würde den Rahmen sprengen, deshalb werden wir uns auf zwei Ereignisgruppen beschränken: Ereignisse, die im Zusammenhang mit dem Laden einer Form stehen, und Ereignisse, die mit dem Entladen in Verbindung gebracht werden. Viele andere, hier noch nicht erwähnte Ereignisse werden durch die Interaktion mit der Maus oder durch die Tastatureingabe ausgelöst. Mit diesen Ereignissen setzen wir uns in einem anderen Kapitel auseinander.
Eine weitere große Gruppe bilden Ereignisse, deren Auslösung durch die Änderung einer Eigenschaft verursacht wird. Stellvertretend für diese Ereignisse seien an dieser Stelle BackColorChanged und VisibleChanged erwähnt. Auf die Ereignisse dieser Gruppe gehen wir nicht näher ein.
15.7.1 Ereignisse beim Erzeugen eines Fenster
 
Beim Laden einer Form werden nach dem Aufruf des Konstruktors mehrere Ereignisse in der folgenden Reihenfolge ausgelöst:
|
Move |
|
Load |
|
Layout |
|
Activated |
|
Paint |
Die Ereignisreihenfolge ist für Sie als Entwickler nicht unwichtig, denn sie hat entscheidenden Einfluss darauf, in welchem Ereignis Sie Ihren Code schreiben. Initialisieren Sie beispielsweise Variablen im Load-Ereignis, stehen diese Werte in dem vorher ausgelösten Ereignis Move noch nicht zur Verfügung. Der Konstruktor einer Form, der in dieser Kette auch eine Rolle spielt, wird ausgeführt, bevor das erste Ereignis der Form ausgelöst wird. Das bedeutet für Sie, dass alle Komponenten der Form beim Auftreten des ersten Ereignisses bereits durch InitializeComponent initialisiert sind.
Es folgt nun eine Beschreibung der oben angeführten Ereignisses beim Laden einer Form:
|
Activated wird ausgelöst, sobald das Formular den Fokus erhält. Das ist der Fall, wenn die Form geladen und angezeigt wird. Außerdem wird dieses Ereignis ausgelöst, wenn eine deaktivierte Form wieder zur aktiven wird. |
|
Layout tritt jedes Mal auf, wenn ein Control neu positioniert werden muss. Um die Performance zu verbessern, unterdrückt die Initialisierungsroutine dieses Ereignis durch den Aufruf der Methode SuspendLayout und hebt mit ResumeLayout die Sperre wieder auf. |
|
Load wird nach dem Initialisieren der Form ausgelöst, jedoch noch bevor das Formular angezeigt wird. Damit ist dieses Ereignis für Anweisungen geeignet, die weitere Ressourcen bereitstellen, beispielsweise eine Datenbankverbindung aufzubauen oder eine Datei zu öffnen. |
|
Move tritt beim Verschieben einer Komponente auf. |
|
Paint tritt immer dann ein, wenn das Fenster neu gezeichnet werden muss. Insbesondere diesem Ereignis werden wir noch besondere Aufmerksamkeit schenken, wenn wir uns mit der grafischen Programmierung beschäftigen. |
15.7.2 Größenänderung einer Form
 
Ereignisreihenfolgen spielen auch dann eine wichtige Rolle, wenn sich zur Laufzeit Bedingungen ändern. Verändern Sie zum Beispiel die Größe der Form oder maximieren Sie sie, kommt es zu den Ereignissen Layout, Resize, SizeChanged und Paint.
Wenn Sie sich nicht klar über die Ereignisreihenfolge sind bzw. wenn Sie wissen wollen, welche Ereignisse bei einer bestimmten Operation ausgelöst werden, empfiehlt es sich, im entsprechenden Ereignishandler die Ausgabe einer Zeichenfolge zu codieren, z.B. mit Debug.WriteLine.
15.7.3 Ereignisse beim Schließen eines Fensters
 
So wie beim Laden und Anzeigen einer Form eine Ereigniskette durchlaufen wird, kommt es dazu auch beim Entladen einer Form:
|
FormClosing |
|
FormClosed |
|
Deactivate |
Erst daran anschließend wird der Destruktor ausgeführt.
| Hinweis Im .NET Framework 2.0 sind die beiden Ereignisbezeichner FormClosing und FormClosed neu. Im .NET Framework 1.0/1.1 hießen die entsprechenden Ereignisse noch Closing und Closed. Hier handelt es sich aber um keine willkürliche Maßnahme, sondern um eine Notwendigkeit, die ihre Ursache darin hat, dass der Typ des zweiten Parameters des Ereignishandlers verändert worden ist.
|
Am wichtigsten ist das Ereignis FormClosing, denn es bietet über dem Parameter vom Typ FormClosingEventArgs und dessen Eigenschaft Cancel die Möglichkeit, den eingeleiteten Schließvorgang der Form quasi im letzten Moment noch einmal abzubrechen. Wird Cancel=true gesetzt, wird die Form nicht geschlossen, der Standardwert false ist gleichbedeutend mit dem unwiderruflichen Schließen.
Das folgende Codefragment zeigt die typische Implementierung dieses Ereignisses. Wird die Form geschlossen und FormClosing ausgelöst, wird ein Meldungsfenster angezeigt, das den Anwender zur Bestätigung des Schließvorgangs oder zum Abbruch des Schließens auffordert. Meldungsfenster behandeln wir in Abschnitt 15.10. Klickt der Anwender die Nein-Schaltfläche im Meldungsfenster, kommt es zum Abbruch des eingeleiteten Schließvorgangs.
| // -------------------------------------------------------------
|
| // Beispiel: ...\Kapitel 15\FormClosingEventDemo
|
| // -------------------------------------------------------------
|
| private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
|
| DialogResult dr =
|
| MessageBox.Show("Wollen Sie die Anwendung beenden?",
|
| "Anwendungsmeldung",
|
| MessageBoxButtons.YesNo,
|
| MessageBoxIcon.Question,
|
| MessageBoxDefaultButton.Button2);
|
| // wird im Meldungsfenster die Schaltflächen 'Nein'
|
| // geklickt, wird der Schließvorgang abgebrochen
|
| if(dr == DialogResult.No)
|
| e.Cancel = true;
|
| }
|
Ist der Ereignishandler von FormClosing vollständig abgearbeitet, ohne den Schließvorgang mit Cancel abzubrechen, wird FormClosed ausgelöst. Jetzt kann das Schließen der Form nicht mehr verhindert werden. Spätestens in diesem Ereignis sollten, falls erforderlich, alle Daten in einer Datei gespeichert und die von der Form beanspruchten Ressourcen wieder freigegeben werden.
Den Grund des Schließens ermitteln
Der Parameter FormClosingEventArgs weist neben der Eigenschaft Cancel noch eine zweite typspezifische auf: CloseReason, die dem Ereignishandler die Ursache des Schließens mitteilt. Sie als Entwickler können damit im Bedarfsfall die auszuführenden Aktionen in Abhängigkeit von der Ursache steuern. CloseReason liefert eine Konstante der gleichnamigen Enumeration, deren Werte Sie der folgenden Tabelle entnehmen können.
Tabelle 15.11 Konstanten der Enumeration »CloseReason«
| CloseReason-Member
|
Beschreibung
|
| ApplicationExitCall
|
Die Methode Application.Exit wurde aufgerufen.
|
| FormOwnerClosing
|
Das Besitzerformular wurde geschlossen.
|
| MdiFormClosing
|
Die übergeordnete MDI-Form wurde geschlossen.
|
| None
|
Die Ursache für das Schließen ist unbekannt.
|
| TaskManagerClosing
|
Die Anwendung wurde mit dem Task-Manager geschlossen
|
| UserClosing
|
Das Formular wurde über die Benutzeroberfläche geschlossen.
|
| WindowsShutDown
|
Das Betriebssystem Windows wurde heruntergefahren.
|
| Hinweis Wenn einem Formular ein anderes Formular als Besitzer zugeordnet ist, wird es zusammen mit dem Besitzerformular minimiert und geschlossen. Um einem Formular ein anderes Formular als Besitzer zuzuweisen, rufen Sie die AddOwnedForm-Methode auf.
|
|